const PubSub={
    id:1,
    callbacks:{}
}

PubSub.subscribe=function(channel,callback)
{
    //创建唯一的编号
    let token='token_'+this.id++;
    if(this.callbacks[channel])
    {
        this.callbacks[channel][token]=callback
    }
    else
    {
        this.callbacks[channel]={[token]:callback}
    }
    return token  //返回id

}

PubSub.publish=function(channel,data){
    if(this.callbacks[channel])
    {
        //遍历对象里的函数 遍历pay 里面有两个函数    values去掉键值  只剩下值 去遍历这些值  返回结果是一个数组
        Object.values(this.callbacks[channel]).forEach(callback=>{
            callback(data)
        })
    }
}


/* 取消订阅信息
1.没有传值，flag为undefined
2.传入token字符串
3.msgName字符串 */

PubSub.unsubscribe=function(flag)
{
    if(flag===undefined)
    {
        this.callbacks={}
    }
    else if(typeof flag ==='string')
    {
       //判断是否为token_开头
       if(flag.indexOf('token_')===0)
       {
         let callbackObj=Object.values(this.callbacks).find(obj=>obj.hasOwnProperty(flag))
         if(callbackObj)
         {
            delete callbackObj[flag]
         }         
       }
       else  //表明为一个频道的名称
       {
        delete this.callbacks[flag]
       }
    }
}